/* @author Shanmugaesan Shanmugaratnam
*  @created on 31.10.2008 11:02:07
*  stellt die GUI dar.
*  updated on 03.11.08
*  aktualisiert am 10.11.2008 von Oleg Starodubtsev. 
*  Menue wurde als externe Klasse gemacht.
*  aktualisiert am 10.11.2008 von Oleg Starodubtsev
*  die Methode "actionPerformed" wurde integriert.
*  updated on 15.11.08 by Shanmugaesan Shanmugaratnam
*  totally worked over
*  updated on 18.11.08 by Michael Antemann anpassung an den Controller
*/
package de.fhhannover.inform.wari.grp8.gui;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

import de.fhhannover.inform.studienklassen.semester3.GeneralStatics;

public class Gui extends JFrame implements ActionListener {
	int[] mPits; 
	   private static final long serialVersionUID = 1L;
	   Container con;
	   Gui_Controller mGuiCon;
	   final static int MULDEN_ANZAHL = 6;
	   final static int GEWINNMULDEN_IMG_ANZAHL = 36;
	   final static int MULDEN_IMG_ANZAHL = 36;
	   public static String statusMsg = " :: Klicken Sie auf 'Spiel' um ein neues Spiel zu starten";
	   
	   JButton[] mulde_A_btns = new JButton[MULDEN_ANZAHL];
	   JButton[] mulde_B_btns = new JButton[MULDEN_ANZAHL];	   
	   ImageIcon[] gewinnmulden_imgs 		= new ImageIcon[GEWINNMULDEN_IMG_ANZAHL];
	   ImageIcon[] gewinnmulden_imgs_help 	= new ImageIcon[2];
	   ImageIcon[] mulden_imgs 				= new ImageIcon[MULDEN_IMG_ANZAHL];
	   ImageIcon[] mulden_imgs_A_help		= new ImageIcon[MULDEN_ANZAHL];
	   ImageIcon[] mulden_imgs_B_help		= new ImageIcon[MULDEN_ANZAHL];
	   ImageIcon turn_img		= new ImageIcon();
	   
	   JLabel[] mulde_A_label = new JLabel[MULDEN_ANZAHL];
	   JLabel[] mulde_B_label = new JLabel[MULDEN_ANZAHL];
	   JLabel spielerA	=  new JLabel();
	   JLabel spielerB	=  new JLabel();
	   JLabel turnimg_lbl = new JLabel();
	   JButton log_lbl ;
	   JButton gewinn_mulde_A_btn;
	   JButton gewinn_mulde_B_btn;
	   JLabel gewinn_mulde_A_lbl;
	   JLabel gewinn_mulde_B_lbl;	   
	   JPanel north_pnl ;
	   JPanel south_pnl ;
	   JTextField statusleiste ;
	   int[] buf_array = new int[MULDEN_ANZAHL*2] ; //erhalte aktueller Spielbrettzustand
	   Logger mylog;
	   
	   public Gui(Gui_Controller guicon,String title) {
		  super(title);
		  mGuiCon = guicon ;
	      con = this.getContentPane();
	      this.setDefaultCloseOperation(EXIT_ON_CLOSE);
	      con.setLayout(new BorderLayout());
	      this.setSize(806, 420);
	      this.setLocation(170, 100);
	      this.setResizable(false);
	      //this.setExtendedState(MAXIMIZED_BOTH);	      	      
	      north_pnl = new JPanel();
	      north_pnl.setPreferredSize(new Dimension(810,350));
	      north_pnl.setLayout(null);
	      north_pnl.setBackground(mGuiCon.getColor()); //ca. Orange Color(254,207,118)
	      south_pnl	= new JPanel();
	      
	      log_lbl = new JButton("Logs");
	      log_lbl.setBounds(720, 15, 80, 20);
	      log_lbl.setBackground(mGuiCon.getColor());
	      log_lbl.addActionListener(this);
	      north_pnl.add(log_lbl) ;
	      
	      statusleiste	= new JTextField(statusMsg,73);  // String,Spaltenanzahl
	      statusleiste.setFont(new Font("Arial",1,12));
	      statusleiste.setEditable(false);
	      south_pnl.setPreferredSize(new Dimension(810,25));
	      south_pnl.add(statusleiste);
		  
	      cacheGewinnmuldenImgs();
	      cacheMuldenImgs();
	      initialiseImgs();
	      createAndArrangeBoard();
	      setTurnImg(true); // true :A ; false : B
	      setSpielerA("Spieler A");
	      setSpielerB("Spieler B");
	      
	      con.add(north_pnl,BorderLayout.NORTH);
	      con.add(south_pnl,BorderLayout.SOUTH);	     	     
//	      this.setVisible(true);  // Fenster anzeigen
	     
	   }
	
	   public void setMenu(Menu menu){
		   this.setJMenuBar(menu.getMenuBar());
	   }
	   // edited by michi 18.11 Disabled icon bekommt auch bilder 
	   
	   public void updatePits(int[] curPits){
		   buf_array = curPits ;
		  // System.out.println("updatepits aufruf ");
		   for(int i=0;i<MULDEN_ANZAHL;i++){
			   mulden_imgs_A_help[i] = mulden_imgs[buf_array[i]];
			   mulde_A_btns[i].setIcon(mulden_imgs_A_help[i]);
			   mulde_A_btns[i].setDisabledIcon(mulden_imgs_A_help[i]);
		   }
		   int z=5;
		   for(int i=11;i>=(MULDEN_ANZAHL);i--,z--) { 			   
			   mulden_imgs_B_help[z] = mulden_imgs[buf_array[i]];
			   mulde_B_btns[z].setIcon(mulden_imgs_B_help[z]);
			   mulde_B_btns[z].setDisabledIcon(mulden_imgs_B_help[z]);
		   }
		//   System.out.println("updatePits in GUI aufruf");
	   }
	   public void updatePitsA(int[] curPits, int time){
		   buf_array = curPits ;
		
		  // System.out.println("updatepits aufruf ");
		   for(int i=0;i<MULDEN_ANZAHL;i++){
			   mulden_imgs_A_help[i] = mulden_imgs[buf_array[i]];
			   mulde_A_btns[i].setIcon(mulden_imgs_A_help[i]);
			   mulde_A_btns[i].setDisabledIcon(mulden_imgs_A_help[i]);
			   mulde_A_label[i].setText(""+buf_array[i]);
		
				try {
					Thread.sleep(time);
					paint(getGraphics());
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			
		   }
	   }
	   public void updatePitsB(int[] curPits, int time){
		   
		   buf_array = curPits ;
		   for(int i=5;i>=0;i--) { 			   
			   mulden_imgs_B_help[i] = mulden_imgs[buf_array[i]];
			   mulde_B_btns[i].setIcon(mulden_imgs_B_help[i]);
			   mulde_B_btns[i].setDisabledIcon(mulden_imgs_B_help[i]);
			   mulde_B_label[i].setText(""+buf_array[i]);
		   	   
		   	try {
				Thread.sleep(time);
				paint(getGraphics());
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		   		this.repaint();
				
		   }
		//   System.out.println("updatePits in GUI aufruf");
	   }
	   
	   protected void updateGewinnMulden(int[] GewinnMulden){
		   this.gewinnmulden_imgs_help[0]=gewinnmulden_imgs[GewinnMulden[0]];
		   this.gewinn_mulde_A_btn.setDisabledIcon(gewinnmulden_imgs_help[0]);
		   this.gewinnmulden_imgs_help[1]=gewinnmulden_imgs[GewinnMulden[1]];
		   this.gewinn_mulde_B_btn.setDisabledIcon(gewinnmulden_imgs_help[1]);
		//   System.out.println("updateGewinnMulden in GUI aufruf");
	   }
	   
	   public void initialiseImgs(){
		   for(int i=0;i<MULDEN_ANZAHL;i++){
		   mulden_imgs_A_help[i]=mulden_imgs[0];
		   mulden_imgs_B_help[i]=mulden_imgs[0];
		   }
		   gewinnmulden_imgs_help[0] = gewinnmulden_imgs[0];
		   gewinnmulden_imgs_help[1] = gewinnmulden_imgs[0];
	   }

	   public void createAndArrangeBoard(){
		   createMuldenA(mulden_imgs_A_help);
		   createMuldenB(mulden_imgs_B_help);
		   createAndArrangeGewinnMulden(gewinnmulden_imgs_help);
	   }
	   
	   public void createMuldenA(ImageIcon[] imgs){
		   for(int index=0;index<MULDEN_ANZAHL;index++) {  // Untere Mulden einfügen
			      mulde_A_btns[index] = new JButton("");
			      mulde_A_btns[index].setBounds(100*(index+1),200, 100, 100); //x,y,width,height
			      mulde_A_btns[index].addActionListener(this);  // von Oleg.
			      mulde_A_label[index] = new JLabel("0");
			      mulde_A_label[index].setBounds(100*(index+1)+50,298, 20, 20);
				  mulde_A_btns[index].setIcon(imgs[index]);				  
				  mulde_A_btns[index].setDisabledIcon(imgs[index]);
				  mulde_A_btns[index].setEnabled(false);
			      north_pnl.add(mulde_A_btns[index]);
			      north_pnl.add(mulde_A_label[index]);
		   }
	   }
	   
	   public void createMuldenB(ImageIcon[] imgs){
		   for(int index=0;index<MULDEN_ANZAHL;index++) {  // Obere Mulden einfügen
			      mulde_B_btns[index] = new JButton("");
			      mulde_B_btns[index].setBounds(100*(index+1),100, 100, 100); //x,y,width,height
			      mulde_B_btns[index].addActionListener(this);  // von Oleg.
			      mulde_B_label[index] = new JLabel("0");
			      mulde_B_label[index].setBounds(100*(index+1)+50,80, 20, 20);				  
				  mulde_B_btns[index].setDisabledIcon(imgs[index]);
				  mulde_B_btns[index].setEnabled(false);
				  mulde_B_btns[index].setIcon(imgs[index]);				  
			      north_pnl.add(mulde_B_btns[index]);
			      north_pnl.add(mulde_B_label[index]);
		   }
	   }
	   public void createAndArrangeGewinnMulden(ImageIcon[] imgs){ 
		   	  gewinn_mulde_A_btn = new JButton("");							
		      gewinn_mulde_A_btn.setBounds(700, 100, 100, 200); // x,y,width,height
		      gewinn_mulde_A_lbl = new JLabel("0");
		      gewinn_mulde_A_lbl.setBounds(750, 80, 20, 20);	      
//		   if(which.equals("A") ){		      
		      gewinn_mulde_A_btn.setEnabled(false);
		      gewinn_mulde_A_btn.setDisabledIcon(imgs[0]);
		      gewinn_mulde_A_btn.setIcon(imgs[0]);
//	   		}
		      north_pnl.add(gewinn_mulde_A_btn);
		      north_pnl.add(gewinn_mulde_A_lbl);
		      gewinn_mulde_B_btn = new JButton(""); // erste Mulde bzw Gewinnmulde von rechts gesehen.
		      gewinn_mulde_B_btn.setBounds(0, 100, 100, 200); // x,y,width,height
		      gewinn_mulde_B_lbl = new JLabel("0");
		      gewinn_mulde_B_lbl.setBounds(50, 80, 20, 20);
//		  if(which.equals("B")){	      
		      gewinn_mulde_B_btn.setEnabled(false);
		      gewinn_mulde_B_btn.setDisabledIcon(imgs[1]);
		      gewinn_mulde_B_btn.setIcon(imgs[1]);
//		    }
		      north_pnl.add(gewinn_mulde_B_btn);
		      north_pnl.add(gewinn_mulde_B_lbl);
	   }
	   
	   public void cacheGewinnmuldenImgs(){
		   for(int index=0;index<GEWINNMULDEN_IMG_ANZAHL;index++) { 
		   gewinnmulden_imgs[index] = GeneralStatics.createImageIcon("/images/gewinn_mulde_"+Integer.toString(index)+".jpg","Gewinnmulde",this);
		   }
	   }
	   public void cacheMuldenImgs(){
		   for(int index=0;index<MULDEN_IMG_ANZAHL;index++) { 
		   mulden_imgs[index] = GeneralStatics.createImageIcon("/images/wari_mulde_"+Integer.toString(index)+".jpg","Mulde",this);
		   }
	   }
	   //Edited by michi 18.11 , alle in einer aktivieren und deaktivieren, bei ki im controler deaktivieren per if.
	   protected void activateBoard(boolean seiteA,boolean seiteB){
		for(int i=0;i<MULDEN_ANZAHL;i++) {
			if(seiteA && !seiteB){
				mulde_A_btns[i].setEnabled(true);
				mulde_B_btns[i].setEnabled(false);
				}
			if(seiteB && !seiteA) {
				mulde_A_btns[i].setEnabled(false);
				mulde_B_btns[i].setEnabled(true);
			}
			if(seiteB && seiteA){
				mulde_A_btns[i].setEnabled(true);
				mulde_B_btns[i].setEnabled(true);
			}
			if(!seiteB && !seiteA){
				mulde_A_btns[i].setEnabled(false);
				mulde_B_btns[i].setEnabled(false);
			}
		}
	   }

	   protected void deactivateBoard(boolean seite,int muldeIndex){  //true ist Seite-A false ist B und der Muldenindex zu deaktivieren
				if(seite) mulde_A_btns[muldeIndex].setEnabled(false);	
				else mulde_B_btns[muldeIndex].setEnabled(false);	
		   }
	   //edited by michi 19.11 modifiziert, es werden jetzt die leeren mulden deaktiviert
	   protected void deactivateBoard(boolean seite, int[] curPits){  //true ist Seite-A false ist B und der Muldenindexarray zu deaktivieren
			 for(int i=0;i<MULDEN_ANZAHL;i++) { 
				 if(seite && curPits[i]==0) 
					 mulde_A_btns[i].setEnabled(false);	
				 if(!seite && curPits[i]==0)
					 mulde_B_btns[i].setEnabled(false);
			 }	
	   }
	   
	   
	   public void setSpielerA(String name){
		   spielerA.setText(name);
		   spielerA.setBounds(380, 320, 250, 20);
		   spielerA.setForeground(new Color(21,143,53));
		   spielerA.setFont(new Font("Arial",1,14)); //Name,style,size
		   north_pnl.add(spielerA);
	   }
	   public void setSpielerB(String name){
		   spielerB.setText(name);
		   spielerB.setBounds(380, 50, 250, 20);
		   spielerB.setForeground(new Color(21,143,53));
		   spielerB.setFont(new Font("Arial",1,14)); //Name,style,size
		   north_pnl.add(spielerB);
	   }
	   public void setTurnImg(boolean seite){ // Seite : true ist A false ist B
		   turn_img = GeneralStatics.createImageIcon("/images/turnarray.jpg","Turn_Img",this);
		   turnimg_lbl.setIcon(turn_img);
		   if(seite) turnimg_lbl.setBounds(330, 318, 35, 25);
		   else turnimg_lbl.setBounds(330, 48, 35, 25);
			north_pnl.add(turnimg_lbl);
	   }
	   
	   protected void setStatusMsg(String msg){
		   this.statusleiste.setText(msg);
	   }
	   
	   protected void setMuldenLabel(int[] curPits){
		   buf_array = curPits ;
		   int z=0;
		   for(int i=0;i<MULDEN_ANZAHL;i++){
			   mulde_A_label[i].setText(""+buf_array[i]);
		   }
		   for(int i=6;i<(MULDEN_ANZAHL*2);i++) { 			   
			   mulde_B_label[z].setText(""+buf_array[i]);
		   	   z++;
		   }
		  // System.out.println("setMuldenLabel in GUI aufruf");
	   }
	   protected void setGewinnMuldenLabel(int[] gmulden){ 
		    gewinn_mulde_A_lbl.setText(""+gmulden[0]);
		    gewinn_mulde_B_lbl.setText(""+gmulden[1]);
	   }
	   
	   public void actionPerformed(ActionEvent e) {
		Object source = e.getSource();
		for(int i = 0; i < MULDEN_ANZAHL; i++){
			if(source ==  mulde_A_btns[i]) {
			//	System.out.println("Mulden_A_Button " + i + " wurde gedruckt");
				//setTurnImg(false);
				mGuiCon.forwardMove( i);
			}
			if(source ==  mulde_B_btns[i]) {
			//	System.out.println("Mulden_B_Button " + i + " wurde gedruckt");
				//setTurnImg(true);
				mGuiCon.forwardMove(i);
			}
			}
			if(source ==  log_lbl){  // Logfenster aufpoppen
				try {
					  mylog = new Logger("Wari G8 Logger");
					  mylog.setVisible(true);
					  }
				  catch(Exception ex) {}
				}
		} 
	  
	}
